flag_quiet: Option<bool>,
flag_color: Option<String>,
flag_bin: bool,
+ flag_lib: bool,
arg_path: Option<String>,
flag_name: Option<String>,
flag_vcs: Option<ops::VersionControl>,
--vcs VCS Initialize a new repository for the given version
control system (git or hg) or do not initialize any version
control at all (none) overriding a global configuration.
- --bin Use a binary instead of a library template
+ --bin Use a binary (application) template
+ --lib Use a library template
--name NAME Set the resulting package name
-v, --verbose ... Use verbose output
-q, --quiet No output printed to stdout
options.flag_frozen,
options.flag_locked));
- let Options { flag_bin, arg_path, flag_name, flag_vcs, .. } = options;
+ let Options { flag_bin, flag_lib, arg_path, flag_name, flag_vcs, .. } = options;
- let opts = ops::NewOptions {
- version_control: flag_vcs,
- bin: flag_bin,
- path: &arg_path.unwrap_or(format!(".")),
- name: flag_name.as_ref().map(|s| s.as_ref()),
- };
+ let tmp = &arg_path.unwrap_or(format!("."));
+ let opts = ops::NewOptions::new(flag_vcs,
+ flag_bin,
+ flag_lib,
+ tmp,
+ flag_name.as_ref().map(|s| s.as_ref()));
+ let opts_lib = opts.lib;
try!(ops::init(opts, config));
+
+ try!(config.shell().status("Created", format!("{} project",
+ if opts_lib { "library" }
+ else {"binary (application)"})));
+
Ok(None)
}
flag_quiet: Option<bool>,
flag_color: Option<String>,
flag_bin: bool,
+ flag_lib: bool,
arg_path: String,
flag_name: Option<String>,
flag_vcs: Option<ops::VersionControl>,
--vcs VCS Initialize a new repository for the given version
control system (git or hg) or do not initialize any version
control at all (none) overriding a global configuration.
- --bin Use a binary instead of a library template
+ --bin Use a binary (application) template
+ --lib Use a library template
--name NAME Set the resulting package name
-v, --verbose ... Use verbose output
-q, --quiet No output printed to stdout
options.flag_frozen,
options.flag_locked));
- let Options { flag_bin, arg_path, flag_name, flag_vcs, .. } = options;
+ let Options { flag_bin, flag_lib, arg_path, flag_name, flag_vcs, .. } = options;
- let opts = ops::NewOptions {
- version_control: flag_vcs,
- bin: flag_bin,
- path: &arg_path,
- name: flag_name.as_ref().map(|s| s.as_ref()),
- };
+ let opts = ops::NewOptions::new(flag_vcs,
+ flag_bin,
+ flag_lib,
+ &arg_path,
+ flag_name.as_ref().map(|s| s.as_ref()));
+ let opts_lib = opts.lib;
try!(ops::new(opts, config));
+
+ try!(config.shell().status("Created", format!("{} `{}` project",
+ if opts_lib { "library" }
+ else {"binary (application)"},
+ arg_path)));
+
Ok(None)
}
pub struct NewOptions<'a> {
pub version_control: Option<VersionControl>,
pub bin: bool,
+ pub lib: bool,
pub path: &'a str,
pub name: Option<&'a str>,
}
}
}
+impl<'a> NewOptions<'a> {
+ pub fn new(version_control: Option<VersionControl>,
+ bin: bool,
+ lib: bool,
+ path: &'a str,
+ name: Option<&'a str>) -> NewOptions<'a> {
+
+ // default to lib
+ let is_lib = if !bin {
+ true
+ }
+ else {
+ lib
+ };
+
+ NewOptions {
+ version_control: version_control,
+ bin: bin,
+ lib: is_lib,
+ path: path,
+ name: name,
+ }
+ }
+}
+
struct CargoNewConfig {
name: Option<String>,
email: Option<String>,
path.display())
}
+ if opts.lib && opts.bin {
+ bail!("can't specify both lib and binary outputs");
+ }
+
let name = try!(get_name(&path, &opts, config));
try!(check_name(name));
bail!("`cargo init` cannot be run on existing Cargo projects")
}
+ if opts.lib && opts.bin {
+ bail!("can't specify both lib and binary outputs");
+ }
+
let name = try!(get_name(&path, &opts, config));
try!(check_name(name));
let macros = [
("[RUNNING]", " Running"),
("[COMPILING]", " Compiling"),
+ ("[CREATED]", " Created"),
("[FINISHED]", " Finished"),
("[ERROR]", "error:"),
("[WARNING]", "warning:"),
#[test]
fn simple_lib() {
- assert_that(cargo_process("init").arg("--vcs").arg("none")
+ assert_that(cargo_process("init").arg("--lib").arg("--vcs").arg("none")
.env("USER", "foo"),
- execs().with_status(0));
+ execs().with_status(0).with_stderr("\
+[CREATED] library project
+"));
assert_that(&paths::root().join("Cargo.toml"), existing_file());
assert_that(&paths::root().join("src/lib.rs"), existing_file());
fs::create_dir(&path).unwrap();
assert_that(cargo_process("init").arg("--bin").arg("--vcs").arg("none")
.env("USER", "foo").cwd(&path),
- execs().with_status(0));
+ execs().with_status(0).with_stderr("\
+[CREATED] binary (application) project
+"));
assert_that(&paths::root().join("foo/Cargo.toml"), existing_file());
assert_that(&paths::root().join("foo/src/main.rs"), existing_file());
}
"#).unwrap();
- assert_that(cargo_process("init").arg("--vcs").arg("none")
+ assert_that(cargo_process("init").arg("--lib").arg("--vcs").arg("none")
.env("USER", "foo").cwd(&path),
execs().with_status(101).with_stderr("\
[ERROR] multiple possible binary sources found:
#[test]
fn simple_git() {
- assert_that(cargo_process("init").arg("--vcs").arg("git")
- .env("USER", "foo"),
+ assert_that(cargo_process("init").arg("--lib")
+ .arg("--vcs")
+ .arg("git")
+ .env("USER", "foo"),
execs().with_status(0));
assert_that(&paths::root().join("Cargo.toml"), existing_file());
let td = TempDir::new("cargo").unwrap();
let foo = &td.path().join("foo");
fs::create_dir_all(&foo).unwrap();
- assert_that(cargo_process("init").cwd(foo.clone())
+ assert_that(cargo_process("init").arg("--lib")
+ .cwd(foo.clone())
.env("USER", "foo"),
execs().with_status(0));
fn git_autodetect() {
fs::create_dir(&paths::root().join(".git")).unwrap();
- assert_that(cargo_process("init")
+ assert_that(cargo_process("init").arg("--lib")
.env("USER", "foo"),
execs().with_status(0));
fn mercurial_autodetect() {
fs::create_dir(&paths::root().join(".hg")).unwrap();
- assert_that(cargo_process("init")
+ assert_that(cargo_process("init").arg("--lib")
.env("USER", "foo"),
execs().with_status(0));
File::create(&paths::root().join(".gitignore")).unwrap().write_all(b"qqqqqq\n").unwrap();
- assert_that(cargo_process("init")
- .env("USER", "foo"),
+ assert_that(cargo_process("init").arg("--lib")
+ .env("USER", "foo"),
execs().with_status(0));
fn cargo_lock_gitignored_if_lib1() {
fs::create_dir(&paths::root().join(".git")).unwrap();
- assert_that(cargo_process("init").arg("--vcs").arg("git")
+ assert_that(cargo_process("init").arg("--lib").arg("--vcs").arg("git")
.env("USER", "foo"),
execs().with_status(0));
#[test]
fn simple_lib() {
- assert_that(cargo_process("new").arg("foo").arg("--vcs").arg("none")
+ assert_that(cargo_process("new").arg("--lib").arg("foo").arg("--vcs").arg("none")
.env("USER", "foo"),
- execs().with_status(0));
+ execs().with_status(0).with_stderr("\
+[CREATED] library `foo` project
+"));
assert_that(&paths::root().join("foo"), existing_dir());
assert_that(&paths::root().join("foo/Cargo.toml"), existing_file());
#[test]
fn simple_bin() {
- assert_that(cargo_process("new").arg("foo").arg("--bin")
+ assert_that(cargo_process("new").arg("--bin").arg("foo")
.env("USER", "foo"),
- execs().with_status(0));
+ execs().with_status(0).with_stderr("\
+[CREATED] binary (application) `foo` project
+"));
assert_that(&paths::root().join("foo"), existing_dir());
assert_that(&paths::root().join("foo/Cargo.toml"), existing_file());
#[test]
fn simple_git() {
let td = TempDir::new("cargo").unwrap();
- assert_that(cargo_process("new").arg("foo").cwd(td.path().clone())
+ assert_that(cargo_process("new").arg("--lib").arg("foo").cwd(td.path().clone())
.env("USER", "foo"),
execs().with_status(0));
#[test]
fn rust_prefix_stripped() {
- assert_that(cargo_process("new").arg("rust-foo").env("USER", "foo"),
+ assert_that(cargo_process("new").arg("--lib").arg("rust-foo").env("USER", "foo"),
execs().with_status(0)
.with_stdout("note: package will be named `foo`; use --name to override"));
let toml = paths::root().join("rust-foo/Cargo.toml");
.file("src/lib.rs", "");
p.build();
- assert_that(p.cargo("new").arg("bar").env("USER", "foo"),
+ assert_that(p.cargo("new").arg("--lib").arg("bar").env("USER", "foo"),
execs().with_status(0)
.with_stderr("\
warning: compiling this new crate may not work due to invalid workspace \
this may be fixable by ensuring that this crate is depended on by the workspace \
root: [..]
+[CREATED] library `bar` project
"));
}